A treatise by Nathan Clark Sanders, known to some as ZackMan, who, being a most excellent expert on thingy32, is qualified to give divers addresses on the subject of
in the form of letter to his young friend interested in creating a Final Fantasy V save state editor.
Outline
A. Data format.
B. Table format.
A. Double and triple values
B. End line and section break codes.
Note: All code presented is Visual Basic code. Even if you don't know BASIC, you won't have to much trouble. For reference and examples of the ideas in this letter, see the thingy32 source code.
Ganoran,
The first thing you need to do when reading data through a table
is to load your data in an array of strings or a single string.
Load the data as hex(ex: Space becomes "20" in ASCII
data). Thingy32 loads only one screenful of data at one time into
memory, treating it as an array and parsing using the Mid$
function(useful if you are using C because that's the way its
strings are). However, if you load the whole 260K file into
memory, an array of strings might work better.
Once you've got your data loaded, you need to have two parallel
arrays of strings. The first one contains the actual text of the
different table values, and the second array contains the hex
values in string form. In thingy32, these are wisely
named combo and comhex respectively. For now I will call them
TableText and TableHex instead(example:
TableHex(1)="AA" TableText(1)="Wa"). Please
note that it is also possible to create your own data type that
combines these two:
Type TableValHex as String * 2Text as StringEnd TypeDim Table(1 To 300) as TableVal
This is better structure but is not completely
necessary.
Thingy32 obtains the table values by parsing .tbl files, which is
outside the scope of this letter.(I don't understand it very well
myself o_o) In your program, it may well be easier to just type
these in by hand as constants since you're only using one set of
table equivalencies. When assigning table values, the array index
must match the value of the hex. That way the
hex values are very easy to match with the data when comparing
them. Please note that thingy32 starts its arrays at 1 and thus
must add 1 to the hex value in case the hex is 00. To avoid this,
just start your arrays at 0. My example code will assume your
arrays start at 0 for simplicity.
Once you have the data and the table values in the correct
format, it is relatively simple to compare the two and obtain the
correct text from the table. Here is some example code that
demonstrates this(simplified from DisplayData of thingy32):
For x = 1 To 16 'loop through a single line finding the table value from the data hex
'note that strData is one screenful of data, stored as a single string.(char[] in C)
strDataHex = Mid$(strData, x + 16 * (y - 1), 1) 'parse the data string array to isolate 1(one) character
char = Hex$(Asc(strDataHex)) 'convert the character to standard hex format(e.g. "1F")
If Len(char) = 1 Then char = "0" & char 'make sure single digit hex are prefixed with "0"
AscVal = Asc(strDataHex) 'get the ASCII number of the character(like treating a char like an int in C)
If TableHex(AscVal) <> "" Then 'check to see if that index has been assigned a table value.
strTableOutput = strTableOutput & TableText(AscVal) 'if it has, add it to the string
End If
Next x
lstItems.Add strTableOutput 'this may not be the right function--I can't remember.
That's it for basic table value reading! The
problem comes when you want to add fancy features like reading of
double and triple hex combinations, end line codes(a necessity
for script dumping), or section break codes. I will attempt to
describe how to implement these. As always, see thingy32's code
for a working example of this. Keep in mind
thingy's code is very ugly, though. The examples
here will look beautiful compared to it.
That said, the first thing for double or triple implementation is
another set of parallel arrays(if you declared the TableVal
structure you can use that for the new array). Fill these just
like the normal table values, except they don't
have to be in any order because we'll search the values with a
For loop instead. Come to think of it, if you wanted
to create an ordered array 65536 long, you could. But not in
QBasic which is why thingy doesn't do that. Anyway, take the
above example code and add
strDataHex2 = Mid$(strData, (x + 1) + 16 * (y - 1), 1) 'get another char and format it
char2 = Hex$(Asc(strDataHex2))
If Len(char2) = 1 then char = "0" & char
AscVal2 = Asc(strDataHex2)
For i = 1 To MaxDoubles 'MaxDoubles is how many doubles there are
If TableHexDbl(i) = char & char2 Then
strTableOutput = strTableOutput & TableTextDbl(i)
Exit For
End If
Next i
If you want to add triples just extend this process(but you will probably be unable to declare an ordered array 16M long :). Now, adding line breaks and section breaks is pretty easy; just create EndLineText and EndLineHex variables and test char against EndLineHex to do line breaks. Do the same for section breaks. Now, something you may be wondering about is letting the user edit the table text. This is completely different and much more complicated. Also, cursor positioning on table values in fairly difficult. Thus, these topics are beyond the scope of this letter. Sorry.
I hope this helps to understand how to add code to your program that reads data through table values.
Sincerely,
ZackMan
Typed this 2nd of March of the year 2000 AD by ZackMan, the undersigned who can't sign because of stupid browser technology limitations.